package com.cpr.demo.datasourcectl;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

/**
 * @author Chen Panrui
 * created at 2022/3/17 19:45
 *
 * 参考:
 * https://www.cnblogs.com/digdeep/p/4512368.html
 *
 * 我的问题:
 * 凡是基于ThreadLocal实现的功能，我脑子都会闪过一个点子，会不会引起OOM？
 * 这种方式，应该是不会引起 ThreadLocal的OOM的，因为枚举在这儿仅仅作为一个标记未
 *
 * String f = "who am I";
 * ThreadLocal<String> tl = new ThreadLocal<>();
 * tl.set(f); // endless loop 也不会引起OOM
 *
 */
@Aspect    // for aop
@Component // for auto scan
@Order(0)  // execute before @Transactional
@Slf4j
public class DataSourceInterceptor {

    @Pointcut("execution(public * com.cpr.demo.service.CprUserService.findOne(*))")
    public void dataSourceDb0(){

    }

    @Pointcut("execution(public * com.cpr.demo.service.CprUserService.findList(*))")
    public void dataSourceDb1(){

    }

    @Before("dataSourceDb0()")
    public void beforeDb0(){
        log.info(">>>使用DB0数据源...");
        DataSourceTypeManager.set(DataSources.DB_0);
    }

    @Before("dataSourceDb1()")
    public void beforeDb1(){
        log.info(">>>使用DB1数据源...");
        DataSourceTypeManager.set(DataSources.DB_1);
    }

    //@After("dataSourceDb1()|dataSourceDb0")
    public void afterDb(){
        log.info("<<<接数使用数据源");
        DataSourceTypeManager.remove();
    }


}
